{
    /**
     * 1. 演示内置接口怎么点
     *      Array<xxx>
     *      鼠标左键 + ctrl（cmd）
     *      方法要看的话要手动先调用下 arr.push 然后在push上老样子点进去看
     * 
     * 2. 泛型不能想当然乱写
     *     举例就是 加法 ，虽然数字和字符串想的逻辑没有问题
     *      但是T泛型是任意类型 对象+对象 不等于 对象  等等
     * 3. 类型守卫 泛型约束
     *      类型守卫 
     *          可选属性 if(判断这个属性有) 在去做逻辑处理
     *          获取个元素（可能能获取到可能null）if(元素) (元素 as 断言) 
     *      泛型约束
     *          T extends 接口 => 表示T必须要有接口里的属性和方法
     */
    let arr: Array<number> = [1,2,3]
    arr.push

    // 数字和数字相加 返回的是数字
    // 字符串和字符串 返回的是字符串
    function add<T> (a: T, b: T) {
        console.log(a, b);
        return `${a}${b}`
    }
    add(1, 2)
    add('1', '2')
    add(true, true)

    function log<T>(val: T) {
        // 数组 字符串
        if (typeof val === 'string' || Array.isArray(val)) {
            // 类型守卫
            console.log(val.length);
        }
    }
    log(1)

    /**
     * 接口名有的公司规范 第一个字母必须是I
     * I 就是 interface
     * interface IPerson {
     * }
     */
    interface ILength {
        length: number
    }

    // extends 继承(受约束 必须要有length字段)
    function log2<T extends ILength>(val: T) {
        console.log(val.length);
    }
    log2('111')
    log2([1, 2, 3])
}


export { }
